Lesson 4

v1.0.0, 2016.12 by David Yi
v1.0.1, 2017.02 modified by Yimeng Zhang
v1.1, 2020.4 edit by David Yi

本次内容要点

  • list 列表用法
  • pickle 序列化
  • 思考:判断两个字符串的相似性等

list 列表用法

列表是 Python 内置的一种数据类型。list 是一种可变、有序的集合,可以随时添加和删除其中的元素。 列表是 Python 程序中最常用的数据类型之一,掌握列表的用法会大大提升 Python 的开发能力。

列表的基本操作:

  • 创建列表
  • 访问列表中的元素
  • 增加元素
  • 删除元素
  • 排序
  • 多维
  • 保存和载入

list 中除了保存一般的数字、字符以外,可以存储 Python 中各种复杂的数据类型,包括 list 本身、对象等。


In [2]:
# 创建列表

a = ['pig', 'cat', 'dog']

print(a)

# 用序号访问列表中的元素,支持双向
# 列表支持一种比较复杂的切片式访问,后面会有专门提及
print(a[1])
print(a[-1])


['pig', 'cat', 'dog']
cat
dog

In [3]:
# 列表初始化
a = []

# 列表末尾追加元素
a.append('bird')
print(a)
a.append('snake')
print(a)


['bird']
['bird', 'snake']

In [4]:
# 列表指定位置插入元素
a.insert(0,'sheep')
print(a)


['sheep', 'bird', 'snake']

In [5]:
# 列表删除指定序号的元素

a.pop(1)
print(a)


['sheep', 'snake']

In [6]:
# 列表删除指定内容的元素

a = ['pig', 'cat', 'dog']
a.remove('dog')
print(a)


['pig', 'cat']

In [7]:
# 列表排序

a = ['pig', 'cat', 'dog', 'snake']
a.sort()
print(a)

# 倒序
a.sort(reverse = True)
print(a)


['cat', 'dog', 'pig', 'snake']
['snake', 'pig', 'dog', 'cat']

In [8]:
# 列表数字排序

a = [1,2,3,4]
a.sort(reverse = True)
print(a)


[4, 3, 2, 1]

In [9]:
# 列表追加另一个列表
# 使用 append 一个列表的话,这个列表会以一个元素的方式追加到原来列表

b = ['cat1', 'cat2', 'cat3']
a.append(b)
print(a)


[4, 3, 2, 1, ['cat1', 'cat2', 'cat3']]

In [10]:
# 列表追加另一个列表的元素
# 使用 extned 一个列表,会以元素的形式追加到原来的列表

a = ['pig', 'cat', 'dog', 'snake']
b = ['cat1', 'cat2', 'cat3']
a.extend(b)
print(a)


['pig', 'cat', 'dog', 'snake', 'cat1', 'cat2', 'cat3']

In [11]:
# 统计某个元素在列表中出现次数

a = ['a','b','b','c']
print(a.count('b'))


2

pickle 序列化

Python 中可以使用 pickle 模块将对象转化为文件保存在磁盘上,在需要的时候再读取并还原。具体用法如下:

pickle.dump(obj, file[, protocol])

pickle 的格式和 Python 版本等有关,不同版本之间不兼容。比较通用的序列化方式是用 json 格式,可以跨平台、跨语言。


In [12]:
# 保存列表内容

# 使用 pickle 模块,import 可以导入另外一个模块,执行其中的功能
import pickle

# files 在这里是路径,需要预先建立好,也可以用这样的 c:\xxx.txt 文件名写法
f = open('files/list_dump.txt', 'wb')
a = ['pig', 'cat', 'dog', 'snake', 'snake']
pickle.dump(a, f)
f.close()

In [13]:
# 读出列表内容

f = open('files/list_dump.txt', 'rb')
a1 = pickle.load(f)
f.close()
print(a1)


['pig', 'cat', 'dog', 'snake', 'snake']

In [14]:
# 两维列表,列表中的每个元素都是一个列表

a = ['pig', 'cat', 'dog']
b = [1,2,3]
c = []

c.append(a)
c.append(b)

print(c)

# 第0个元素的第1个元素
print(c[0][1]) # cat

# 第1个元素的第2个元素
print(c[1][2]) # 3


[['pig', 'cat', 'dog'], [1, 2, 3]]
cat
3

In [15]:
# 列表生成式 初步
# 过滤列表中的重复元素

b = [x for x in a if a.count(x) == 1]
print(b)


['pig', 'cat', 'dog']

In [16]:
# 显示一个对象的方法
# python 中一切皆对象
# 面向对象的编程是现代编程技术中的基本概念

print(dir(list))


['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

In [17]:
# 用列表生成式来生成一个对象的方法
# 过滤掉继承的方法,也就是带下划线的

[x for x in dir(list) if x[0] != '_']


Out[17]:
['append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

思考

  1. 判断两个字符串的相似性

In [20]:
# 利用 Python 内置函数判断两个字符串的相似性

from difflib import SequenceMatcher

def similarity(a, b):
    return SequenceMatcher(None, a, b).ratio()

print(similarity('这是一个有趣的问题', '这是一个有趣的问题'))
print(similarity('这是一个有趣的问题', '这基本上是一个有趣的问题'))
print(similarity('这是一个有趣的问题', '高高的山上有只羊'))

# 其实并不是那么聪明
print(similarity('快捷支付是哪四要素', '快捷支付接口这里的四要素是什么'))

# python 内置的 difflib 虽然不是那么智能,不过功能还是很强大的,可以用它很容易的制作出类似代码比较的工具


1.0
0.8571428571428571
0.2857142857142857
0.5833333333333334

  1. 给一个用户名列表(英文),输入开头几个字母,程序会搜索用户名列表中是否存在和开头字母类似的,并提示用户。执行效果如下:
please input name : C
Do you want to find ['Candy', 'Chris']?1
Chris

In [19]:
# 补充用户名字,利用切片的例子
name = ['Adam','Alex','Amy','Bob','Boom','Candy','Chris','David','Jason','Jasonstatham','Bill'];
i_name = input('please input name : ')

wname = [];
for n in name:
    if n[0:len(i_name)] == i_name:
        wname.append(n);

if len(wname) != 0:
    number = input('Do you want to find %s?'%(wname))
    print(wname[int(number)])
else:
    print('%s not find'%(i_name))


please input name : david
david not find
  1. 判断用户输入的是数字还是字符串

有很多种方法,一般用的比较多也建议使用是的捕捉错误的办法,通过将输入的默认的字符串进行转换为数字,如果不能转换,说明用户输入的不是数字。 这里介绍一种比较优雅的方法来判断是否输入的是数字,通过使用 isdigit 函数,顾名思义,就是判断是否是数字的函数。


In [4]:
number  = input("Enter number")
if( number.isdigit()):
    print("Number ")
else:
    print("String ")


Enter number2
Number 

In [7]:
# 看看 str 字符串有多少方法
print(dir(str))


['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别 https://www.cnblogs.com/guigujun/p/6133057.html


In [ ]: